home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0257 / demo.exe / FILES.DEM < prev    next >
Text File  |  1992-02-16  |  28KB  |  1,018 lines

  1. ; ----------------------------
  2. ; FILES.DEM    - Demoprogramm für die Routinen aus FILES.LIB
  3. ;                (für den A86)
  4. ;
  5. ;                (c) Bernd Schemmer 1990 - 1992
  6. ;                Letzter Update: 15.02.1992
  7. ;
  8. ; Übersetzen:
  9. ;  A86 FILES.DEM DEMOS.INC TO FILES.COM
  10. ;
  11. ; Hinweis: Die Environment-Variable 'A86' muß den Dateinamen 'MACROS.MAC'
  12. ;          enthalten und die .LIB-Dateien müssen über die Datei A86.LIB
  13. ;          erreichbar sein.
  14. ;
  15. ; ---------------------------
  16.  
  17.          jmp start            ; Daten überspringen
  18.  
  19. logo  db CR,LF
  20.       db 'FILES.DEM  - Demoprogramm für die Routinen aus FILES.LIB'
  21.       db CR,LF
  22.       db '--------------------------------------------------------'
  23.       db CR,LF
  24. GETLENGTH logo
  25.  
  26.  
  27. DefString FileName1,65        ; Puffer für einen Dateinamen
  28. DefString FileName2,129       ; Puffer für einen Dateinamen
  29.                               ; (Länge wg. GetFilePathh)
  30.  
  31. Ask      db 0                 ; Hilfsvariable
  32.  
  33. ; ----------------------------
  34.  
  35. start:
  36.          call ShowLogo        ; Logo ausgeben und Speicherblock verkleinern
  37.  
  38. l00:
  39.          call ShowMenue       ; Menue ausgeben
  40.                               ; AL = eingegebene Taste
  41.          cld
  42.          mov si,offset MenuePunkte
  43.          mov bl,al            ; BL = eingegebene Taste
  44. l0:
  45.          lodsb
  46.          or al,al
  47.          jz l00               ; Ende der Tabelle erreicht
  48.          cmp al,bl
  49.          lodsw                ; AX = Offset der Routine
  50.          jne l0
  51.          call ax              ; Routine aufrufen
  52.          jmp start
  53.  
  54. Ende:
  55.          EndProcess 0
  56.  
  57. ; ----------------------------
  58. ; ShowMenue
  59. ;
  60. ; Funktion: Ausgabe des Menues und Lesen der Eingabe
  61. ;
  62. ; Ausgabe:  AL = eingegebene Taste
  63. ;
  64. MenuePunkte db                ; Tabelle mit den einzelnen Menuepunkten
  65.          db 'X'               ; Aufbau: 3 Byte pro Eintrag
  66.          dw Offset Ende       ; Byte 0     : Ziffer oder Buchstabe des
  67.          db ESC               ;              Menuepunktes
  68.          dw Offset Ende       ; Byte 1 - 2 : Offset der Routine für den
  69.          db 'A'               ;              Menuepunkt
  70.          dw Offset _CopyFile  ; Als Endekennung funktioniert ein Eintrag
  71.          db 'B'               ; mit dem Wert 0 für den Buchstaben.
  72.          dw Offset _RenameFile
  73.          db 'C'
  74.          dw Offset _DeleteFile
  75.          db 'D'
  76.          dw Offset _ExistFile
  77.          db 'E'
  78.          dw Offset _SetFileAttributes
  79.          db 'F'
  80.          dw Offset _GetFileAttributes
  81.          db 'G'
  82.          dw Offset _GetFileTimeDate
  83.          db 'H'
  84.          dw Offset _ShowDirectory
  85.          db 'I'
  86.          dw Offset _TouchFile
  87.          db 'J'
  88.          dw Offset _GetFileSize
  89.          db 'K'
  90.          dw Offset _GetFilepath
  91.          db 'L'
  92.          dw Offset _ShowDirectory1
  93.          db 0                 ; Endekennung
  94.  
  95. MaxMenuePunkt EQU 'L'         ; letzter Menuepunkt
  96.  
  97. Menue db CR,LF
  98.       db 'Zur Verfügung stehende Routinen:'
  99.       db CR,LF
  100.       db '--------------------------------'
  101.       db CR,LF
  102.       db 'A  CopyFile        B   RenameFile         C   DeleteFile'
  103.       db CR,LF
  104.       db 'D  ExistFile       E   SetFileAttributes  F   GetFileAttributes'
  105.       db CR,LF
  106.       db 'G  GetFileDate/GetFileTime                H   FindFirst/FindNext für Dateien'
  107.       db CR,LF
  108.       db 'I  SetFileDate/SetFileTime                J   GetFileSize     '
  109.       db CR,LF
  110.       db 'K  GetFilePath                            L   FindFirst/FindNext für Directorys'
  111.       db CR,LF
  112.       db CR,LF
  113.       db 'X  Ende'
  114.       db CR,LF
  115.       db CR,LF
  116.       db 'Bitte wählen Sie: '
  117. GETLENGTH Menue
  118.  
  119. SHowMenue:
  120.          WRITE_STRING Menue
  121. l0:
  122.          mov ah,08h
  123.          int 021h             ; Taste lesen
  124.  
  125.          cmp al,ESC
  126.          je >l1
  127.          and al,0DFh          ; Eingabe in Großbuchstaben konvertieren
  128.  
  129.          cmp al,'X'
  130.          je >l1
  131.  
  132.          cmp al,MaxMenuePunkt
  133.          ja l0
  134.          cmp al,'A'
  135.          jb l0
  136. l1:
  137.          push ax              ; Eingabe sichern
  138.          call ShowCR_LF       ; Neue Zeile ausgeben
  139.          pop ax               ; AX = Eingabe
  140.          ret
  141.  
  142. ; ----------------------------
  143. ; _TouchFile
  144. ;
  145. ; Funktion: Setzt das Datum und die Zeit einer Datei auf die akt. Werte
  146. ;
  147. MakeMsg TouchFileMsg,    'SETFILEDATE/SETFILETIME - Setzen der Zeit/des Datums einer Datei',CR,LF
  148. MakeMsg TouchFileMsg1,   'Datum und Zeit der Datei aktualisiert.'
  149. MakeMsg TouchFileTError, 'Fehler beim Ändern der Zeit.'
  150. MakeMsg TouchFileDError, 'Fehler beim Ändern des Datums.'
  151.  
  152. _TouchFile:
  153.          mov ask,0FFh
  154.  
  155.          WRITE_STRING TouchFileMsg
  156.          call GetFileName1    ; Lesen der Eingabe
  157.  
  158.          mov ah,02Ch
  159.          int 021h             ; DOS-Zeit ermitteln
  160.  
  161.                               ; Zeit der Datei setzen
  162.          mov si,offset FileName1
  163.          call SetFileTime
  164.          jnc >l1
  165.                               ; Fehler!
  166.          WRITE_STRING TouchFileTError
  167.          jmp >l9
  168.  
  169. l1:
  170.          mov ah,02Ah
  171.          int 021h             ; DOS-Datum ermitteln
  172.  
  173.                               ; Datum der Datei setzen
  174.          mov si,offset FileName1
  175.          call SetFileDate
  176.          jnc >l1
  177.                               ; Fehler!
  178.          WRITE_STRING TouchFileDError
  179.          jmp >l9
  180.  
  181. l1:
  182.          WRITE_STRING TouchFileMsg1
  183.  
  184.          call _GetFileTimeDate1
  185.  
  186. l9:
  187.          call ShowCR_LF
  188.          call AskUser
  189.          if nc jmp _TouchFile
  190.          ret
  191.  
  192. ; ----------------------------
  193. ; _GetFileSize
  194. ;
  195. ; Funktion: Ermittelt die Größe einer Datei
  196. ;
  197. MakeMsg GetFileSizeMsg,   'GETFILESIZE - Ermitteln der Größe einer Datei ',CR,LF
  198. MakeMsg GetFileSizeError, 'Fehler beim Ermitteln der Dateigröße.'
  199. MakeMsg GetFileSizeMsg1,  'Die Datei ist _____ Byte groß.'
  200. MakeMsg GetFileSizeMsg2,  'Die Datei ist größer als 65.535 Byte.'
  201.  
  202. _GetFileSize:
  203.          WRITE_STRING GetFileSizeMsg
  204.          call GetFileName1    ; Lesen der Eingabe
  205.  
  206.          mov si,offset FileName1
  207.          call GetFileSize
  208.          jc >l8               ; Fehler!
  209.  
  210.          or dx,dx
  211.          jz >l1
  212.                               ; Datei ist größer als 65.535 Byte
  213.          WRITE_STRING GetFileSizeMsg2
  214.          jmp >l9
  215.  
  216. l1:
  217.                               ; Dateigröße ausgeben
  218.          mov di,offset GetFileSizeMsg1+14
  219.          call Konvert_AX_To_DezString
  220.          WRITE_STRING GetFileSizeMsg1
  221.          jmp >l9
  222.  
  223. l8:
  224.                               ; Fehler beim Ermitteln der Dateigröße
  225.          WRITE_STRING GetFileSizeError
  226.  
  227. l9:
  228.          call ShowCR_LF
  229.          call AskUser
  230.          if nc jmp _GetFileSize
  231.          ret
  232.  
  233. ; ----------------------------
  234. ; _GetFilePath
  235. ;
  236. ; Funktion:  Fügt einen Dateinamen den Pfad an und splittet diesen
  237. ;            Eintrag dann in Pfad und Namen auf.
  238. ;
  239. MakeMsg Getfilemsg,'GETFILEPATH/PARSEFILENAME - Erweitern und Splitten eines Dateinamens',CR,LF
  240. MakeMsg GetFileMsg2,         'Der vollständige Dateiname lautet: '
  241. MakeMsg GetFileMSG3,  CR,LF, 'und das ganze aufgesplittet in Pfad und Namen:'
  242. MakeMsg GetFileerror, CR,LF, 'Fehler beim Ermitteln des Pfades!'
  243.  
  244. _GetFilePath:
  245.          WRITE_STRING GetFilemsg
  246.          call GetFileName1              ; Lesen der Eingabe
  247.  
  248.          mov si,offset FileName1        ; Dateinamen um den Pfad erweitern
  249.          mov di,offset FileName2
  250.          call GetFilePath
  251.          jnc >l1
  252.                                         ; Fehler
  253.          WRITE_STRING GetFileError
  254.          jmp GetFilePathNewTry
  255.  
  256. l1:                                     ; Ergebnis ausgeben
  257.          WRITE_STRING GetFileMSg2
  258.          mov dx,offset FileName2+1
  259.          mov cl,FileName2
  260.          xor ch,ch
  261.          mov bx,01h
  262.          mov ah,040h
  263.          int 021h
  264.  
  265.          WRITE_STRING GetFileMSg3
  266.                                         ; Dateinamen splitten
  267.          mov si,offset FileName2
  268.          mov di,offset Filename1
  269.          call ParseFileName
  270.  
  271.          mov dx,si                      ; Ergebnis ausgeben
  272.          inc dx
  273.          mov cl,[si]
  274.          mov bx,01h
  275.          mov ah,040h
  276.          int 021h
  277.  
  278.          call ShowCR_LF
  279.  
  280.          mov dx,di
  281.          inc dx
  282.          mov cl,[di]
  283.          mov bx,01h
  284.          mov ah,040h
  285.          int 021h
  286.  
  287. GetFilePathNewTry:
  288.          call ShowCR_LF
  289.          call AskUser
  290.          if nc jmp _GetFilePath
  291.          ret
  292.  
  293. ; ----------------------------
  294. ; _ShowDirectory
  295. ;
  296. ; Funktion: Ausgabe des Directorys
  297. ;
  298. ;
  299. MakeMsg dirmsg0,  'FINDFIRST/FINDNEXT - Suchen von Dateien nach einer Maske',CR,LF
  300. MakeMsg direrror, 'Fehler beim Suchen!'
  301. MakeMsg dirokay,  'Gefundene Dateien: '
  302.  
  303. DirDTA   db 43 dup 0          ; DTA zum Suchen der Einträge
  304. DirEntry db 0,65 dup 0        ; Puffer für die gefundenen Einträge
  305. Count    db 0                 ; Zähler für die seitenweise Ausgabe
  306.  
  307. _ShowDirectory:
  308.          WRITE_STRING dirmsg0
  309.          mov Count,0          ; Zähler zurücksetzen
  310.          call GetFileName1
  311.  
  312.          WRITE_STRING dirokay
  313.  
  314.                               ; Suchattribute setzen
  315.          mov w FindAttribute,DefaultAttr
  316.  
  317.                               ; Erste Datei suchen
  318.          mov si,offset FileName1
  319.          mov dx,offset DirDTA
  320.          mov di,offset DirEntry
  321.          call FindFirst
  322. l0:
  323.          jnc >l1
  324.                               ; Fehler aufgetreten
  325.          cmp ax,018xD         ; Fehler; Keine weiteren Dateien?
  326.          je >l9               ; ja
  327.                               ; nein, anderer Fehler
  328.          WRITE_STRING direrror
  329.          jmp >l9
  330.  
  331. l1:
  332.                               ; gefundenen Eintrag ausgeben
  333.          mov dx,offset direntry+1
  334.          mov cl,direntry
  335.          xor ch,ch            ; CX = Länge des gefundenen Eintrages
  336.          mov bx,01h
  337.          mov ah,040h
  338.          int 021h
  339.          call ShowDirEntryData
  340.          inc Count
  341.          cmp Count,10xD
  342.          jb >l1
  343.          call ShowPause
  344.          mov Count,0
  345.          jc >l9              
  346. l1:
  347.                               ; nächsten Eintrag ermitteln
  348.          mov si,offset FileName1
  349.          mov dx,offset DirDTA
  350.          mov di,offset DirEntry
  351.          call FindNext
  352.          jmp l0
  353.  
  354. l9:
  355.          call ShowCR_LF
  356.          call AskUser
  357.          if nc jmp _ShowDirectory
  358.          ret
  359.  
  360. ; ----------------------------
  361. ; _ShowDirectory1
  362. ;
  363. ; Funktion: Ausgabe des Directorys
  364. ;
  365. ;
  366. MakeMsg dir1msg0,  'FINDFIRST/FINDNEXT - Suchen von Directorys nach einer Maske',CR,LF
  367. MakeMsg dir1error, 'Fehler beim Suchen!'
  368. MakeMsg dir1okay,  'Gefundene Directorys: '
  369.  
  370. _ShowDirectory1:
  371.          WRITE_STRING dir1msg0
  372.          mov Count,0          ; Zähler zurücksetzen
  373.          call GetFileName1
  374.  
  375.          WRITE_STRING dir1okay
  376.                               ; Suchattribute setzen
  377.          mov w FindAttribute,SubDir
  378.  
  379.                               ; Erstes Directory suchen
  380.          mov si,offset FileName1
  381.          mov dx,offset DirDTA
  382.          mov di,offset DirEntry
  383.          call FindFirst
  384.  
  385. l0:
  386.          jnc >l1
  387.                               ; Fehler aufgetreten
  388.          cmp ax,018xD         ; Fehler; Keine weiteren Einträge?
  389.          je >l9               ; ja
  390.                               ; nein, anderer Fehler
  391.          WRITE_STRING dir1error
  392.          jmp >l9
  393.  
  394. l1:
  395.                               ; Attribute des Eintrages überprüfen
  396.          mov bx,offset DirDTA
  397.          mov cl,_DTAAttr[bx]  ; CL = Attribute des Eintrages
  398.          test cl,SubDir
  399.          jz >l1               ; kein Directory
  400.  
  401.                               ; gefundenen Eintrag ausgeben
  402.          mov dx,offset direntry+1
  403.          mov cl,direntry
  404.          xor ch,ch            ; CX = Länge des gefundenen Eintrages
  405.          mov bx,01h
  406.          mov ah,040h
  407.          int 021h
  408.  
  409.          call ShowDirEntryData
  410.          inc Count
  411.          cmp Count,10xD
  412.          jb >l1
  413.          call ShowPause
  414.          mov Count,0
  415.          jc >l9              
  416. l1:
  417.                               ; nächsten Eintrag ermitteln
  418.          mov si,offset FileName1
  419.          mov dx,offset DirDTA
  420.          mov di,offset DirEntry
  421.          call FindNext
  422.          jmp l0
  423.  
  424. l9:
  425.          call ShowCR_LF
  426.          call AskUser
  427.          if nc jmp _ShowDirectory1
  428.          ret
  429.  
  430. ; ----------------------------
  431. ; ShowDirEntryData
  432. ;
  433. ; Funktion: Ausgabe der Daten eines Diretory-Eintrages
  434. ;
  435. DirEntryData db CR,LF
  436.              db '  ==> Attribute: '
  437. DirEntryAttr db '_____, Datum: '
  438. DirEntryDate db '__.__.__ Zeit: '
  439. DirEntryTime db '__:__:__, Größe: '
  440. DirEntryLen  db '_____'
  441.              db CR,LF
  442. GetLength DirEntryData
  443.  
  444. ShowDirEntryData:
  445.          push ax,bx,cx,dx
  446.  
  447.          mov bx,offset DirDTA  ; DS:BX -> DTA
  448.  
  449.          mov dx,_DTADate[bx]  ; DX = Datum im Datei-Format
  450.  
  451.                               ; Datum ins DOS-Format konvertieren
  452.          call FileDateToDOSDate
  453.                               ; Datum in die Meldung eintragen
  454.          mov al,dl
  455.          mov di,offset DirEntryDate
  456.          call StoreAL
  457.  
  458.          mov al,dh
  459.          inc di
  460.          call StoreAL
  461.  
  462.          sub cx,1900xD
  463.          mov al,cl
  464.          inc di
  465.          call StoreAL
  466.  
  467.          mov cx,_DTATime[bx]  ; CX = Zeit im Datei-Format
  468.                               ; Zeit ins DOS-Format konvertieren
  469.          call FileTimeToDOSTime
  470.  
  471.                               ; Zeit in die Meldung eintragen
  472.          mov al,ch
  473.          mov di,offset DirEntryTime
  474.          call StoreAL
  475.  
  476.          mov al,cl
  477.          inc di
  478.          call StoreAL
  479.  
  480.          mov al,dh
  481.          inc di
  482.          call StoreAL
  483.          mov ax,_DTALength[bx]
  484.          cmp w _DTALength[bx+2],0
  485.          jz >l1
  486.                               ; Directory zu groß für dieses Demo
  487.          mov w DirEntryLen,'__'
  488.          mov w DirEntryLen+2,'__'
  489.          mov b DirEntryLen+4,'_'
  490.          jmp >l2
  491. l1:
  492.          mov di,offset DirEntryLen
  493.          call Konvert_AX_TO_Dezstring
  494.  
  495. l2:
  496.          mov cl,_DTAAttr[bx]  ; CL = Attribute des Eintrages
  497.          mov di,offset DirEntryAttr
  498.          call KonvertAttributesToString
  499.  
  500.  
  501.          Write_String DirEntryData
  502.  
  503.          pop dx,cx,bx,ax
  504.          ret
  505.  
  506. ; ----------------------------
  507. ; _GetFileTimeDate
  508. ;
  509. ; Funktion: Ermittelt das Datum und die Zeit einer Datei
  510. ;
  511. MakeMsg TimeDatePrompt, 'GETFILEDATE/GETFILETIME - Ermitteln des Datums und der Zeit einer Datei',CR,LF
  512. MakeMsg TimeDateError,  'Fehler beim Ermitteln der Werte!'
  513.  
  514. TimeDateOkay    db 'Die Datei wurde zuletzt am '
  515. _Date           db '__.__.__  um '
  516. _Time           db '__.__.__  Uhr verändert.'
  517.                 db CR,LF
  518. GETLENGTH TimeDateOkay
  519.  
  520. _GetFileTimeDate:
  521.          mov ask,0
  522.          WRITE_STRING timedatePrompt
  523.  
  524.          call GetFileName1    ; Dateinamen lesen
  525.  
  526.  
  527. _GetFileTimeDate1:            ; Einsprungpunkt von TouchFile
  528.          mov si,offset FileName1
  529.          call GetFileDate     ; Datum ermitteln
  530.          jc >l1
  531.                               ; Datum in die Meldung eintragen
  532.          mov al,dl
  533.          mov di,offset _date
  534.          call StoreAL
  535.  
  536.          mov al,dh
  537.          inc di
  538.          call StoreAL
  539.  
  540.          sub cx,1900xD
  541.          mov al,cl
  542.          inc di
  543.          call StoreAL
  544.  
  545.          mov si,offset FileName1
  546.          call GetFileTime     ; Zeit ermitteln
  547.          jc >l1
  548.                               ; Zeit in die Meldung eintragen
  549.          mov al,ch
  550.          mov di,offset _time
  551.          call StoreAL
  552.  
  553.          mov al,cl
  554.          inc di
  555.          call StoreAL
  556.  
  557.          mov al,dh
  558.          inc di
  559.          call StoreAL
  560.  
  561.          WRITE_STRING TimeDateOkay
  562.          jmp >l2
  563.  
  564. l1:
  565.          WRITE_STRING TimeDateError
  566.  
  567. l2:
  568.          cmp ask,0
  569.          jne ret
  570.  
  571.          call AskUser         ; Nochmal?
  572.          IF nc jmp _GetFileTimeDate
  573.          ret
  574.  
  575. ; ----------------------------
  576. ; _CopyFile
  577. ;
  578. ; Funktion: Kopiert eine Datei
  579. ;
  580. MakeMsg CopyFilePrompt,'COPYFILE - Kopieren einer Datei',CR,LF
  581. MakeMsg CopyError0,    'Fehler: Zuwenig Speicher zum Kopieren!'
  582. MakeMsg CopyFileError, 'Fehler beim Kopieren!'
  583. MakeMsg CopyFileOkay,  'Datei kopiert.'
  584.  
  585. CopyPufferTable dw 0,0,0      ; Tabelle für CopyFile
  586.  
  587. _CopyFile:
  588.          WRITE_STRING CopyFilePrompt
  589.                               ; Testen, ob der Puffer schon ermittelt ist
  590.          cmp CopyPufferTable,0
  591.          jne >l1              ; Puffer schon initialisiert
  592.  
  593.                               ; Puffer muß noch ermittelt werden
  594.          call InitCopyPuffer  ; Speicher für den Puffer ermitteln
  595.          jnc >l1
  596.                               ; Fehler: Puffer konnte nicht bereitgestellt
  597.                               ;         werden!
  598.          WRITE_STRING CopyError0
  599.          jmp >l9              ; und raus
  600.  
  601. l1:
  602.          call GetFileName1    ; Namen der Quelldatei ermitteln
  603.          call GetFileName2    ; Namen der Zieldatei ermitteln
  604.  
  605.                               ; Datei kopieren
  606.          mov si,offset filename1
  607.          mov di,offset filename2
  608.          mov bx,offset copyPufferTable
  609.          call CopyFile
  610.          jc >l1
  611.                               ; okay
  612.          WRITE_STRING CopyFileOkay
  613.          jmp >l2
  614.  
  615. l1:                           ; Fehler
  616.          WRITE_STRING CopyFileError
  617.  
  618. l2:
  619.          call AskUser         ; Nochmal ?
  620.          if nc jmp _CopyFile  ; ja
  621. l9:
  622.          ret
  623.  
  624. ; ----------------------------
  625. ; InitCopyPuffer
  626. ;
  627. ; Funktion: Bereitstellen eines Puffers für die Copy-Funktion
  628. ;
  629. ; Ausgabe:  CF = 1 -> Fehler, Puffer konnte nicht bereitgestellt werden
  630. ;           CF = 0 -> okay, Puffer-Tabelle gefüllt
  631. ;
  632. InitCopyPuffer:
  633.                               ; Speicher anfordern
  634.          mov bx,01000h        ; 1 Segment (= Maximum)
  635.          mov ah,048h
  636.          int 021h
  637.          jnc >l1              ; kein Fehler
  638.  
  639.          or bx,bx             ; Zur Vorsicht!
  640.          stc
  641.          jz >l9
  642.  
  643.                               ; Fehler, kein Segment mehr frei
  644.          mov ah,048h          ; nehmen wir was wir kriegen können (steht in BX)
  645.          int 021h
  646.          jc >l9               ; Fehler raus
  647.  
  648. l1:                           ; Puffertabelle füllen
  649.          mov w CopyPufferTable,ax  ; Segment des Puffers eintragen
  650.          mov w CopyPufferTable+2,0 ; Offset des Puffers eintragen
  651.          shl bx,1
  652.          shl bx,1
  653.          shl bx,1
  654.          shl bx,1                  ; BX = Größe des Puffers in Byte
  655.          or bx,bx
  656.          if z mov bx,0FFFFh
  657.          mov CopyPufferTable+4,BX  ; Größe eintragen
  658. l9:
  659.          ret
  660.  
  661. ; ----------------------------
  662. ; _RenameFile
  663. ;
  664. ; Funktion: Benennt eine Datei um
  665. ;
  666. MakeMsg RenameFilePrompt, 'RENAMEFILE - Umbenennen einer Datei',CR,LF
  667. MakeMsg RenameFileError,  'Fehler beim Umbenennen!'
  668. MakeMsg RenameFileOkay,   'Datei umbenannt.'
  669.  
  670. _RenameFile:
  671.          WRITE_STRING RenameFilePrompt
  672.  
  673.          call GetFileName1    ; Namen der Quelldatei ermitteln
  674.          call GetFileName2    ; Namen der Zieldatei ermitteln
  675.                               ; Datei kopieren
  676.          mov si,offset filename1
  677.          mov di,offset filename2
  678.          call RenameFile
  679.          jc >l1
  680.                               ; okay
  681.          WRITE_STRING RenameFileOkay
  682.          jmp >l2
  683.  
  684. l1:                           ; Fehler
  685.          WRITE_STRING RenameFileError
  686.  
  687. l2:
  688.          call AskUser         ; Nochmal?
  689.          jnc _RenameFile
  690. l9:
  691.          ret
  692.  
  693. ; ----------------------------
  694. ; _ExistFile
  695. ;
  696. ; Funktion: Feststellen, ob eine Datei exisitiert
  697. ;           Findet keine Geräte
  698. ;
  699. MakeMsg ExistFilePrompt, 'EXISTFILE - Feststellen, ob eine Datei existiert',CR,LF
  700. MakeMsg ExistFileError,  'Angegebene Datei existiert nicht!'
  701. MakeMsg ExistFileOkay,   'Angegebene Datei existiert.'
  702.  
  703. _ExistFile:
  704.          WRITE_STRING existfilePrompt
  705.  
  706.          call GetFileName1    ; Dateinamen lesen
  707.  
  708.          mov si,offset FileName1
  709.          call ExistFile
  710.          jc >l1
  711.                               ; Datei existiert
  712.          WRITE_STRING ExistFileOkay
  713.          jmp >l2
  714. l1:
  715.          WRITE_STRING ExistFileError
  716. l2:
  717.          call AskUser         ; Nochmal?
  718.          jnc _ExistFile
  719.          ret
  720.  
  721. ; ----------------------------
  722. ; _DeleteFile
  723. ;
  724. ; Funktion: Löschen einer Datei
  725. ;
  726. MakeMsg DeleteFilePrompt, 'DELETEFILE - Löschen einer Datei',CR,LF
  727. MakeMsg DeleteFileError,  'Fehler beim Löschen der Datei!'
  728. MakeMsg DeleteFileOkay,   'Angegebene Datei gelöscht.'
  729.  
  730. _DeleteFile:
  731.          WRITE_STRING DeletefilePrompt
  732.          call GetFileName1
  733.  
  734.          mov si,offset FileName1
  735.          call DeleteFile
  736.          jc >l1
  737.                               ; Datei gelöscht
  738.          WRITE_STRING DeleteFileOkay
  739.          jmp >l2
  740. l1:                           ; Fehler
  741.          WRITE_STRING DeleteFileError
  742. l2:
  743.          call AskUser         ; Nochmal?
  744.          jnc _DeleteFile      
  745.          ret
  746.  
  747. ; ----------------------------
  748. ; _GetFileAttributes
  749. ;
  750. ; Funktion: Ermittelt die Attribute einer Datei
  751. ;
  752.  
  753. MakeMsg GetFileAttributesPrompt, 'GETATTRIBUTES - Ermittelt die Attribute einer Datei',CR,LF
  754.  
  755. MakeMsg GetFileAttributesError,  'Fehler beim Ermitteln der Attribute!'
  756. MakeMsg GetFileAttributesOkay,   'Attribute der Datei sind: ______'
  757.  
  758. GetError db 0                 ; Hilfsvariable für _SetFileAttributes
  759. SaveAttr dw 0                 ; Sichern der Attribute für _SetFileAttributes
  760.  
  761. ; ------------------
  762.  
  763. _GetFileAttributes:
  764.          mov ask,0            ; Aufrufschalter auf 0
  765.          mov GetError,0       ; Fehler-Variable auf 0
  766.  
  767.          WRITE_STRING GetFileAttributesPrompt
  768.  
  769.          call GetFileName1    ; Dateinamen lesen
  770.  
  771. _GetFileAttributes1:          ; Einsprungpunkt für SetFileAttributes
  772.  
  773.          mov si,offset FileName1
  774.          xor al,al
  775.          call GetSetAttributes
  776.          jc >l1
  777.                               ; Attribute ermittelt
  778.                               ; Attribute in eine lesbare Form bringen
  779.                               ; AX = Attribute
  780.  
  781.          mov SaveAttr,ax      ; Attribute für _SetFileAttributes sichern
  782.      mov cx,ax            ; Attribute nach CX
  783.  
  784.          mov di,offset GetFileAttributesOkay+26
  785.          mov ah,'_'
  786.          call KonvertAttributesToString
  787.  
  788.  
  789.          WRITE_STRING GetFileAttributesOkay
  790.  
  791.          jmp >l2
  792.  
  793. l1:                           ; Fehler
  794.          mov GetError,0FFh    ; Fehlermarker setzen (für _SetFileAttributes)
  795.          WRITE_STRING GetFileAttributesError
  796.  
  797. l2:
  798.          cmp ask,0
  799.          jne >l9              ; wurden von _SetFileAttributes aufgerufen
  800.  
  801.          call AskUser         ; Nochmal?
  802.          if nc jmp _GetFileAttributes
  803. l9:
  804.          clc
  805.          ret
  806.  
  807. ; ----------------------------
  808. ; _SetFileAttributes
  809. ;
  810. ; Funktion: Setzen der Attribute einer Datei
  811. ;
  812. MakeMsg  SetFileAttributesPrompt,  'SetAttributes - Setzen der Attribute einer Datei',CR,LF
  813. MakeMsg  SetFileAttributesPrompt1, 'Zuerst die alten Attribute ermitteln ...'
  814. MakeMsg  SetFileAttributesError,   'Fehler beim Setzen der Attribute!'
  815. MakeMsg  SetFileAttributesError1,  'Fehler beim Lesen der Attribute!'
  816. MakeMsg  SetFileAttributesOkay,    'Attribute geändert'
  817. MakeMsg1 AttributesPrompt,         'Bitte die neuen Attribute eingeben (ÜBERSCHREIBEN die alten!): '
  818.  
  819. Attributes db 07,07 dup 0     ; Puffer für die neuen Attribute
  820.  
  821. _SetFileAttributes:
  822.          mov ask,1            ; Schalter von _GetFileAttributes setzen
  823.          mov GetError,0       ; Fehlermarker auf 0
  824.  
  825.          WRITE_STRING SetFileAttributesPrompt
  826.          call GetFileName1
  827.  
  828.          WRITE_STRING SetFileAttributesPrompt1
  829.          call _GetFileAttributes1
  830.          cmp GetError,0
  831.          if ne jmp SetEnd     ; Attribute konnten nicht ermittelt werden
  832.  
  833.                               ; Neuen Attribute einlesen
  834.          WRITE_STRING AttributesPrompt
  835.  
  836.          mov dx,offset Attributes
  837.          mov ah,0Ah
  838.          int 021h
  839.          call ShowCR_LF
  840.                               ; Neue Attribute konvertieren
  841.          mov si,offset Attributes
  842.          inc si
  843.          lodsb                ; AL = Anzahl der eingegebenen Attribute
  844.          mov cl,al
  845.          xor ch,ch
  846.          xor bx,bx
  847.          jcxz >l2
  848. l0:
  849.          lodsb
  850.          and al,0DFh          ; Zeichen in Großbuchstaben wandeln
  851.  
  852.          cmp al,'A'
  853.          if e or bx,20h       ; Archiv
  854.  
  855.          cmp al,'S'
  856.          if e or bx,04h        ; System
  857.  
  858.          cmp al,'H'
  859.          if e or bx,02h        ; Hidden
  860.  
  861.          cmp al,'R'
  862.          if e or bx,01h       ; ReadOnly
  863.          loop l0
  864.  
  865. l2:
  866.          mov cx,bx            ; CX = neue Attribute
  867.          mov si,offset FileName1
  868.          mov al,01
  869.          call GetSetAttributes
  870.          jc >l1
  871.                               ; Attribute gesetzt
  872.          WRITE_STRING SetFileAttributesOkay
  873.                               ; neue Attribute nochmal ausgeben
  874.          call _GetFileAttributes1
  875.          jmp >l2
  876.  
  877. l1:                           ; Fehler
  878.          WRITE_STRING SetFileAttributesError
  879.  
  880. l2:
  881. SetEnd:
  882.          call AskUser
  883.          if nc jmp _SetFileAttributes
  884.          ret
  885.  
  886. ; ----------------------------
  887. ; AskUser
  888. ;
  889. ; Funktion: Einlesen von JA oder NEIN
  890. ;
  891. ; Ausgabe:  CF = 1  ->> Nein eingegeben
  892. ;           CF = 0  ->> Ja eingegeben
  893. ;
  894. AskUserPrompt db CR,LF
  895.               db 'Noch einmal? '
  896. GETLENGTH AskUserPrompt
  897.  
  898. AskUser:
  899.          WRITE_STRING AskUserPrompt
  900. l0:
  901.          mov ah,08h
  902.          int 021h
  903.          call ShowCR_LF
  904.  
  905.          cmp al,CR
  906.          je >l1
  907.          cmp al,ESC
  908.          je >l2
  909.          and al,0DFh          ; AL in Großbuchstaben konvertieren
  910.  
  911.          cmp al,'J'
  912.          je >l1
  913.          cmp al,'N'
  914.          jne l0
  915.  
  916. l2:                           ; nein
  917.          stc
  918.          ret
  919. l1:                           ; ja
  920.          clc
  921.          ret
  922.  
  923. ; ----------------------------
  924. ; GetFileName1
  925. ;
  926. ; Funktion: Liest den ersten Dateinamen ein
  927. ;
  928. MakeMsg Prompt1, 'Bitte den Namen der 1. Datei (Quelldatei) eingeben: '
  929.  
  930. GetFileName1:
  931.          WRITE_STRING prompt1
  932.          mov si,offset filename1
  933.          jmp >l1
  934.  
  935. ; ----------------------------
  936. ; GetFileName2
  937. ;
  938. ; Funktion: Liest den zweiten Dateinamen ein
  939. ;
  940. MakeMsg Prompt2, 'Bitte den Namen der 2. Datei (Zieldatei) eingeben: '
  941.  
  942. GetFileName2:
  943.          WRITE_STRING prompt2
  944.          mov si,offset filename2
  945. l1:
  946.          call GetFileName
  947.          ret
  948.  
  949. ; ----------------------------
  950. ; GetFileName
  951. ;
  952. ; Funktion: Liest einen Dateinamen ein
  953. ;
  954. ; Eingabe:  DS:SI -> Puffer für den Dateinamen
  955. ;
  956. GetFileName:
  957.          dec si
  958.  
  959.          mov al,[si]          ; Zeichen sichern
  960.          push ax
  961.          mov b[si],64
  962.          mov dx,si            ; Dateiname lesen
  963.          mov ah,0Ah
  964.          int 021h
  965.          pop ax
  966.          mov [si],al          ; Zeichen vor dem Namen wieder restaurieren
  967.          call ShowCR_LF
  968.          ret
  969.  
  970. ; ----------------------------
  971. ; KonvertAttributesToString
  972. ;
  973. ; Funktion: Konvertiert die Attribute einer Datei zu einem String
  974. ;
  975. ; Eingabe:  CL = Attribute
  976. ;           ES:DI -> Puffer für den String (6 Zeichen)
  977. ;
  978.  
  979. AttrStr db 'ADVSHR'        ; Zeichen für die Attribute
  980. MaxAttribut EQU 020h
  981.  
  982. KonvertAttributesToString:
  983.          push bx,dx,si
  984.  
  985.          mov dl,MaxAttribut
  986.          mov ah,'_'
  987.          mov si,offset AttrStr
  988.  
  989. l00:
  990.          lodsb
  991.          test cl,dl           ; Attribut gesetzt?
  992.          if z mov al,ah
  993.          stosb
  994.          shr dl,1             ; nächstes Attribut
  995.          jnc l00
  996.  
  997.          pop si,dx,bx
  998.          ret
  999.  
  1000. ; ----------------------------
  1001. ; StoreAL
  1002. ;
  1003. ; Funktion: Konvertiert AL in einen zweistellige Dezimalstring
  1004. ;
  1005. ; Eingabe:  AL = zu konvertierender Wert
  1006. ;           ES:DI -> Puffer für den Dezimalstring
  1007. ;
  1008. StoreAL:
  1009.          push bx
  1010.          xor ah,ah
  1011.          mov bl,0Ah
  1012.          div bl
  1013.          add ax,'00'
  1014.          stosw
  1015.          pop bx
  1016.          ret
  1017.  
  1018.